import axios,{ AxiosError,type Method } from 'axios'
import {useUserStore} from '@/stores'
import { showFailToast } from 'vant';
import router from '@/router';

const instance = axios.create({
    // TODO 1. 基础地址，超时时间
    baseURL:'https://consult-api.itheima.net',
    timeout:5000
  })
  
  //请求拦截器
  instance.interceptors.request.use(
    (config) => {
      // TODO 2. 携带token
      //获取token
      const store = useUserStore()
      //判断是否有token
      if(store.user?.token && store.user){
        config.headers.Authorization = `Bearer ${store.user.token}`
      }
      return config
    },
    (err) => Promise.reject(err)
  )
  
  instance.interceptors.response.use(
    (res) => {
      // TODO 3. 处理业务失败
      // 3.1 判断 业务状态码是否不是10000 不是10000 代表这次业务请求失败
      if(res.data.code !== 10000){
        // 3.2 提示用户
        showFailToast(res.data.message || '业务失败')
        //返回Promise错误
        return Promise.reject(res.data)
      }
      // TODO 4. 摘取核心响应数据
      return res.data
    },
    (err: AxiosError) => {
      // TODO 5. 处理401错误
      if(err.response?.status === 401){
        const store = useUserStore()
        //删除用户信息
        store.delUser()
        // 跳转登录页
        router.push('/login')
    }
      return Promise.reject(err)
    }
  )
  
  export default instance


 // 定义服务器响应回来的数据类型
type ResDataType<T> = {
    code: number
    message: string
    data: T
  }


  /** 
   * 封装请求方法
   * @param url 请求地址
   * @param method 请求方式
   * @param submitData 请求数据
  */
  export function request<T>(
    url:string,
    method: Method = 'GET',
    submitData?: object
 ){
    return instance.request<any, ResDataType<T>>({
        url,
        method,
        [method.toUpperCase() === 'GET' ? 'params' : 'data'] : submitData
    })
 }